
/**
 方法：让新实例的原型等于父类的实例。
 特点：
     1、实例可继承的属性有：
     实例的构造函数的属性，
     父类构造函数属性，
     父类原型的属性。（新实例不会继承父类实例的属性！）

 　缺点：
    1、新实例无法向父类构造函数传参。
 　2、继承单一。
    3、所有新实例都会共享父类实例的属性。
 （原型上的属性是共享的，一个实例修改了原型属性，另一个实例的原型属性也会被修改！）


 注意事项：
 重写父级原型链的方法或者添加父级原型链不存在的方法，必须在父级原型链代码之后。
 通过原型链实现继承后，不能再使用字面量的方式创建原型对象，因为会覆盖原型链。
 //子级-原型属性：继承父级
 Child .prototype = new Parent()

 //不能像下面这样，这样会使得上面的代码无效
 //因为这相当于重新创建了一个原型对象
 Child.prototype = {
 getSonValue: function() {
  return this.sonProp
 }
}

 */

//父级-构造函数
function Parent(){
    this.parentProp = true
    this.arr = [1,2]
}

//父级-原型属性
Parent.prototype.getParentProp = function(){
    return this.parentProp
}
Parent.prototype.show=function(){
    console.log('parent show...')
}
Parent.prototype.obj={
    get(){
        console.log('Parent obj get...')
    }
}

//子级-构造函数
function Child (){
    this.childProp = true
}

//子级-原型属性：继承父级。改变Child的prototype指针,指向一个Parent的实例
Child.prototype = new Parent()

// Child原型的构造函数修复为Child,如果不设置则Child的实例化的constructor指向Parent，而不是Child
Child.prototype.constructor = Child;
//并且不可以枚举
Object.defineProperty(Child.prototype,'constructor',{
    value:Child,
    enumerable:false
})

//子级-添加原型方法,注意一定要在Child.prototype = new Parent()之后
Child.prototype.getChildProp = function(){
    return this.childProp
}
//重写父类的show方法
Child.prototype.show=function(){
    console.log('Child show..')
}
//重写父类的obj方法
Child.prototype.obj={
    get(){
        console.log('Child ob get...')
    }
}

//创建子级的实例对象
var child = new Child()
console.log(child.getParentProp()) //true

var child1 = new Child()
console.log(child1.arr) //1 2

var child2 = new Child()
child2.arr.push(3)
console.log(child2.arr) //1 2 3
console.log(child1.arr) //1 2 3 // 一个实例修改了原型属性，另一个实例的原型属性也会被修改
console.log(child1.constructor) // [Function: Child]



console.log()
console.log('-----------------------------')
child1.show=function(){
    console.log('修改child1的show')
}

child1.show()
child2.show()

/*
构造函数Per未继承Person之前：

new Per() -----> Per.prototype -----> Object.prototype ----> null

构造函数Per继承Person之后：
new Per() -----> Per.prototype -----> Person.prototype -----> Object.prototype ----> null

*/

console.log('测试是否是深克隆到父级的原型对象')
let parent = new Parent()
parent.obj.get() // Parent obj get...
child1.obj.get() //Child obj get...
